package org.atlantis.grosbeak.depot.weaver;

import org.atlantis.grosbeak.depot.DepotMaker;
import org.atlantis.grosbeak.logger.Logger;
import org.atlantis.grosbeak.logger.LoggerFactory;

/**
 * 对象构造器。用来构造单态的对象。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">SeeNoEvil</a>
 * 
 */
public class StaticWeaver extends DynamicWeaver {

	private static final Logger logger = LoggerFactory
			.getLogger(StaticWeaver.class);

	private Object obj;
	// 是否已经经过初始化
	private boolean inited = false;

	/**
	 * 设定构建完毕的对象。
	 * 
	 * @param obj
	 *            构建完毕的对象。
	 */
	public void setObj(Object obj) {
		this.obj = obj;
		inited = true;
	}

	/**
	 * 销毁对象。会触发对象的destroy事件。其实对象不会被销毁，对象还是要靠虚拟机来销毁，这里只是触发对象的destroy事件而已。
	 */
	@Override
	public void destroy() {
		if (null != destroy) {
			logger.debugFmt("Event: destroy object...");
			destroy.trigger(obj);
			logger.debugFmt("Event: destroy done");
		}
	}

	/**
	 * 构建对象。实际上是调用DynamicWeaver的weave方法来完成的。但是在构建对象的时候
	 * 首先会判断一下，这个对象是否被构建过，如果被构建过，就直接返回；否则就重新构建。
	 */
	@Override
	public Object weave(DepotMaker maker) {
		if (!inited)
			setObj(super.weave(maker));
		return obj;
	}
}
